﻿using log4net;
using PcaCore.DAL;
using PcaParqueos.BOL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PcaParqueos.DAL
{
    public class dRegistro
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dRegistro));

        #region public

        public static long Insert(string empresaId,
							      string oficinaId,
                                  string usuarioId,
							      int tipoVehiculoId,
							      string placa,
							      long sesionId,
							      DateTime fechaHoraIngreso)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_parqueos.fn_add_registro(varchar,--empresa_id $1
                //            varchar,--oficina_id $2
                //            varchar,--usuario_id $3
                //            integer,--tipo_vehiculo_id $4
                //            varchar,--placa $5
                //            bigint,--sesion_id $6
                //            timestamp with time zone --fecha_hora_ingreso $7
                //            )RETURNS bigint
                object id = Core.ExecuteScalar("pca_parqueos.fn_add_registro",
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, usuarioId),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, tipoVehiculoId),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, placa),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, sesionId),
                                              new oParametro(NpgsqlTypes.NpgsqlDbType.TimestampTZ, fechaHoraIngreso));

                return Convert.ToInt64(id); 
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oVwRegistro Get(string empresaId,
                               string oficinaId,
                               long registroId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_registro(varchar,--empresa_id $1
                //            varchar,--oficina_id $2
                //            bigint --registro_id $3
                //            )RETURNS SETOF pca_parqueos.vw_registros
                return Core.GetObjectDb<oVwRegistro>("pca_parqueos.fn_get_registro",
                                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registroId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwRegistro> GetListActivo(string empresaId,
                                                      string oficinaId,
                                                      string placa)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_parqueos.fn_get_list_registros_activos(varchar,--empresa_id $1
                //                      varchar,--oficina_id $2
                //                      varchar --placa $3
                //                      )RETURNS SETOF pca_parqueos.vw_registros
                return Core.GetListObjecstDb<oVwRegistro>("pca_parqueos.fn_get_list_registros_activos",
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, placa));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static long EmitirComprobante(string empresaId,
                                             string oficinaId,
                                             long registroId,
                                             long liquidacionId,
                                             string usuarioId,
                                             long clienteId,
                                             long sesionId,
                                             int horasContabilizadas,
                                             string tipoComprobanteId,
                                             string monedaId,
                                             decimal precioVenta,
                                             decimal efectivoPercibido)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_parqueos.fn_emitir_comprobante(varchar,--empresa_id $1
                //                  varchar,--oficina_id $2
                //                  bigint,--registro_id $3
                //                  bigint,--liquidacion_id $4
                //                  character,--usuario_id $5
                //                  bigint,--cliente_id $6
                //                  bigint,--sesion_id $7
                //                  integer,--horas_contabilizadas $8
                //                  varchar,--tipo_comprobante_id $9
                //                  varchar,--moneda_id $10
                //                  numeric,--precio_venta $11
                //                  numeric --efectivo_percibido $12
                //                  )RETURNS bigint
                object id = Core.ExecuteScalar("pca_parqueos.fn_emitir_comprobante",
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registroId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, liquidacionId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, usuarioId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, clienteId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, sesionId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, horasContabilizadas),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, tipoComprobanteId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, monedaId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Numeric, precioVenta),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Numeric, efectivoPercibido));

                return Convert.ToInt64(id);  
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion
    }
}
